{% extends '__base__.html' %}
{% block title %}数据类型和变量-Jack's web app{% endblock %}

{% block content %}
<h3>数据类型和变量</h3>
<p>Author:Jack</p>
<h3>数据类型</h3>
<p>计算机顾名思义就是可以做数学计算的机器，因此，计算机程序理所当然地可以处理各种数值。但是，计算机能处理的远不止数值，还可以处理文本、图形、音频、视频、网页等各种各样的数据，不同的数据，需要定义不同的数据类型。
 在Python中，能够直接处理的数据类型有以下几种：</p>
<h3>整数</h3>
<p>Python可以处理任意大小的整数，当然包括负整数，在程序中的表示方法和数学上的写法一模一样，例如：1，100，-8080，0，等等。</p>
<p>计算机由于使用二进制，所以，有时候用十六进制表示整数比较方便，十六进制用0x前缀和0-9，a-f表示，例如：0xff00，0xa5b4c3d2，等等。</p>
<p>对于很大的数，例如10000000000，很难数清楚0的个数。Python允许在数字中间以_分隔，因此，写成10_000_000_000和10000000000是完全一样的。十六进制数也可以写成0xa1b2_c3d4。</p>
<h3>浮点数</h3>
<p>浮点数也就是小数，之所以称为浮点数，是因为按照科学记数法表示时，一个浮点数的小数点位置是可变的，比如，1.23x109和12.3x108是完全相等的。浮点数可以用数学写法，如1.23，3.14，-9.01，等等。
 但是对于很大或很小的浮点数，就必须用科学计数法表示，把10用e替代，1.23x109就是1.23e9，或者12.3e8，0.000012可以写成1.2e-5，等等。</p>
<p>整数和浮点数在计算机内部存储的方式是不同的，整数运算永远是精确的（除法难道也是精确的？是的！），而浮点数运算则可能会有四舍五入的误差。</p>
<h3>字符串</h3>
<p>字符串是以单引号'或双引号"括起来的任意文本，比如'abc'，"xyz"等等。请注意，''或""本身只是一种表示方式，不是字符串的一部分，因此，字符串'abc'只有a，b，c这3个字符。
 如果'本身也是一个字符，那就可以用""括起来，比如"I'm OK"包含的字符是I，'，m，空格，O，K这6个字符。</p>
<p>如果字符串内部既包含'又包含"怎么办？可以用转义字符\来标识，比如：</p>
<pre class="code1">
'I\'m \"OK\"!'
</pre>
<p>表示的字符串内容是：</p>
<pre class="code1">
I'm "OK"!
</pre>
<p>转义字符\可以转义很多字符，比如\n表示换行，\t表示制表符，字符\本身也要转义，所以\\表示的字符就是\，可以在Python的交互式命令行用print()打印字符串看看：</p>
<pre class="code1">
&gt;&gt;&gt; <b>print</b>('I\'m ok.')
I'm ok.
&gt;&gt;&gt; <b>print</b>('I\'m learning\nPython.')
I'm learning
Python.
&gt;&gt;&gt; <b>print</b>('\\\n\\')
\
\
</pre>
<p>如果字符串里面有很多字符都需要转义，就需要加很多\，为了简化，Python还允许用r''表示''内部的字符串默认不转义，可以自己试试：</p>
<pre class="code1">
&gt;&gt;&gt; <b>print</b>('\\\t\\')
\       \
&gt;&gt;&gt; <b>print</b>(r'\\\t\\')
\\\t\\
</pre>
<p>如果字符串内部有很多换行，用\n写在一行里不好阅读，为了简化，Python允许用'''...'''的格式表示多行内容，可以自己试试：</p>
<pre class="code1">
&gt;&gt;&gt; <b>print</b>('''line1
... line2
... line3''')
line1
line2
line3
</pre>
<p>上面是在交互式命令行内输入，注意在输入多行内容时，提示符由>>>变为...，提示你可以接着上一行输入，注意...是提示符，不是代码的一部分：</p>
<pre>
┌────────────────────────────┐
│Command Prompt - python                           - □ x│
├────────────────────────────┤
│&gt;&gt;&gt; print('''line1                                      │
│... line2                                               │
│... line3''')                                           │
│line1                                                   │
│line2                                                   │
│line3                                                   │
│                                                        │
│&gt;&gt;&gt; _                                                   │
│                                                        │
│                                                        │
│                                                        │
└────────────────────────────┘
</pre>
<p>当输入完结束符```和括号)后，执行该语句并打印结果。</p>
<p>如果写成程序并存为.py文件，就是：</p>
<pre class="code1">
<b>print</b>('''line1
line2
line3''')
</pre>
<p>多行字符串'''...'''还可以在前面加上r使用，请自行测试：</p>
<pre class="code1">
<b>print</b>(r'''hello,\n
world''')
</pre>
<button class="button1" onclick='document.getElementById("run1").style.display="block"'>▶ Run</button>
<pre class="code2" id="run1" style="display:none">
hello,\n
world
</pre>
<h3>布尔值</h3>
<p>布尔值和布尔代数的表示完全一致，一个布尔值只有True、False两种值，要么是True，要么是False，在Python中，可以直接用True、False表示布尔值（请注意大小写），也可以通过布尔运算计算出来：</p>
<pre class="code1">
&gt;&gt;&gt; <code style="color:blue">True</code>
<code style="color:blue">True</code>
&gt;&gt;&gt; <code style="color:blue">False</code>
<code style="color:blue">False</code>
&gt;&gt;&gt; 3&gt;2
<code style="color:blue">True</code>
&gt;&gt;&gt; 3&gt;5
<code style="color:blue">False</code>
</pre>
<p>布尔值可以用and、or和not运算。</p>
<p>and运算是与运算，只有所有都为True，and运算结果才是True：</p>
<pre class="code1">
&gt;&gt;&gt; <code style="color:blue">True</code> <b>and</b> <code style="color:blue">True</code>
<code style="color:blue">True</code>
&gt;&gt;&gt; <code style="color:blue">True</code> <b>and</b> <code style="color:blue">False</code>
<code style="color:blue">False</code>
&gt;&gt;&gt; <code style="color:blue">False</code> <b>and</b> <code style="color:blue">False</code>
<code style="color:blue">False</code>
&gt;&gt;&gt; 5&gt;3 <b>and</b> 3&gt;1
<code style="color:blue">True</code>
</pre>
<p>or运算是或运算，只要其中有一个为True，or运算结果就是True：</p>
<pre class="code1">
&gt;&gt;&gt; <code style="color:blue">True</code> <b>or</b> <code style="color:blue">True</code>
<code style="color:blue">True</code>
&gt;&gt;&gt; <code style="color:blue">True</code> <b>or</b> <code style="color:blue">False</code>
<code style="color:blue">True</code>
&gt;&gt;&gt; <code style="color:blue">False</code> <b>or</b> <code style="color:blue">False</code>
<code style="color:blue">False</code>
&gt;&gt;&gt; 5&gt;3 <b>or</b> 1&gt;3
<code style="color:blue">True</code>
</pre>
<p>not运算是非运算，它是一个单目运算符，把True变成False，False变成True：</p>
<pre class="code1">
&gt;&gt;&gt; <b>not</b> <code style="color:blue">True</code>
<code style="color:blue">False</code>
&gt;&gt;&gt; <b>not</b> <code style="color:blue">False</code>
<code style="color:blue">True</code>
&gt;&gt;&gt; <b>not</b> 1&gt;2
<code style="color:blue">True</code>
</pre>
<p>布尔值经常用在条件判断中，比如：</p>
<pre class="code1">
<b>if</b> age&gt;=18:
    <b>print</b>('adult')
<b>else</b>:
    <b>print</b>('teenager')
</pre>
<h3>空值</h3>
<p>空值是Python里一个特殊的值，用None表示。None不能理解为0，因为0是有意义的，而None是一个特殊的空值。</p>
<p>此外，Python还提供了列表、字典等多种数据类型，还允许创建自定义数据类型，我们后面会继续讲到。</p>
<h3>变量</h3>
<p>变量的概念基本上和初中代数的方程变量是一致的，只是在计算机程序中，变量不仅可以是数字，还可以是任意数据类型。</p>
<p>变量在程序中就是用一个变量名表示了，变量名必须是大小写英文、数字和_的组合，且不能用数字开头，比如：</p>
<pre class="code1">
a=1
</pre>
<p>变量a是一个整数。</p>
<pre class="code1">
t_007='T007'
</pre>
<p>变量t_007是一个字符串。</p>
<pre class="code1">
Answer=<b>True</b>
</pre>
<p>变量Answer是一个布尔值True。</p>
<p>在Python中，等号=是赋值语句，可以把任意数据类型赋值给变量，同一个变量可以反复赋值，而且可以是不同类型的变量，例如：</p>
<pre class="code1">
a=123 #a是整数
print(a)
a='ABC' #a是字符串
print(a)
</pre>
<button class="button1" onclick='document.getElementById("run2").style.display="block"'>▶ Run</button>
<pre class="code2" id="run2" style="display:none">
123
ABC
</pre>
<p>这种变量本身类型不固定的语言称之为动态语言，与之对应的是静态语言。静态语言在定义变量时必须指定变量类型，如果赋值的时候类型不匹配，就会报错。例如C，C++，Java是静态语言，赋值语句如下（// 表示注释）：</p>
<pre class="code1">
<b>int</b> a=123; <var style="color:rgb(153,153,136)">// a是整数类型变量</var>
a="ABC"; <var style="color:rgb(153,153,136)">// 错误：不能把字符串赋给整型变量</var>
</pre>
<p>和静态语言相比，动态语言更灵活，就是这个原因。</p>
<p>请不要把赋值语句的等号等同于数学的等号。比如下面的代码：</p>
<pre class="code1">
x=10
x=x+2
</pre>
<p>如果从数学上理解x=x+2那无论如何是不成立的，在程序中，赋值语句先计算右侧的表达式x+2，得到结果12，再赋给变量x。由于x之前的值是10，重新赋值后，x的值变成12。</p>
<p>最后，理解变量在计算机内存中的表示也非常重要。当我们写：</p>
<pre class="code1">
a='ABC'
</pre>
<p>时，Python解释器干了两件事情：</p>
<p>1.在内存中创建了一个'ABC'的字符串；</p>
<p>2.在内存中创建了一个名为a的变量，并把它指向'ABC'。</p>
<p>也可以把一个变量a赋值给另一个变量b，这个操作实际上是把变量b指向变量a所指向的数据。</p>
<h3>常量</h3>
<p>所谓常量就是不能变的变量，比如常用的数学常数π就是一个常量。在Python中，通常用全部大写的变量名表示常量：(当然下面这个常量有些变态)</p>
<pre class="code1">
PI=3.141592653589793238462643383279503
</pre>
<p>但事实上PI仍然是一个变量，Python根本没有任何机制保证PI不会被改变，所以，用全部大写的变量名表示常量只是一个习惯上的用法，如果你一定要改变变量PI的值，也没人能拦住你。</p>
<p>最后解释一下整数的除法为什么也是精确的。在Python中，有两种除法，一种除法是/：</p>
<pre class="code1">
&gt;&gt;&gt; 10/3
3.3333333333333334
</pre>
<p>/除法计算结果是浮点数，即使是两个整数恰好整除，结果也是浮点数：</p>
<pre class="code1">
&gt;&gt;&gt; 9/3
3.0
</pre>
<p>还有一种除法是//，称为地板除，两个整数的除法仍然是整数：</p>
<pre class="code1">
&gt;&gt;&gt; 10//3
3
</pre>
<p>你没有看错，整数的地板除//永远是整数，即使除不尽。要做精确的除法，使用/就可以。</p>
<p>因为//除法只取结果的整数部分，所以Python还提供一个余数运算，可以得到两个整数相除的余数：</p>
<pre class="code1">
&gt;&gt;&gt; 10%3
1
</pre>
<p>无论整数做//除法还是取余数，结果永远是整数，所以，整数运算结果永远是精确的。</p>
<h3>小结</h3>
<p>Python支持多种数据类型，在计算机内部，可以把任何数据都看成一个“对象”，而变量就是在程序中用来指向这些数据对象的，对变量赋值就是把数据和变量给关联起来。</p>
<p>对变量赋值x=y是把变量x指向真正的对象，该对象是变量y所指向的。随后对变量y的赋值不影响变量x的指向。</p>
<p>注意：Python的整数没有大小限制，而某些语言的整数根据其存储长度是有大小限制的，例如Java对32位整数的范围限制在-2147483648 ~ 2147483647。</p>
<p>Python的浮点数也没有大小限制，但是超出一定范围就直接表示为inf（Infinity——无限大）。</p>
<a href="http://localhost:9090/webapp/python/pythonbasics">&lt;&lt;上一页</a>
<a href="http://localhost:9090/webapp/python/pythonencoding" style="float:right">下一页&gt;&gt;</a>
{% endblock %}